package com.dc.toolkit.json_jackson;

import com.fasterxml.jackson.annotation.*;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Date;


/**
 * - @JsonIgnoreProperties注解是类注解。
 * 		在序列化为JSON的时候，@JsonIgnoreProperties({"prop1", "prop2"})会忽略pro1和pro2两个属性。
 * 		在从JSON反序列化为Java类的时候，@JsonIgnoreProperties(ignoreUnknown=true)会忽略所有没有Getter和Setter的属性。
 * 		该注解在Java类和JSON不完全匹配的时候很有用。
 * - @JsonIgnoreType也是类注解，会排除所有指定类型的属性。
 * - @JsonPropertyOrder和@JsonProperty的index属性类似，指定属性序列化时的顺序。
 * - @JsonRootName注解用于指定JSON根属性的名称。
 */
@Data
@Accessors(chain = true)
@JsonRootName("student")
//@JsonPropertyOrder(value={"age","name","birthday","mobile"})
//@JsonIgnoreProperties({"studentPhone","mobile"})
@JsonIgnoreType
public class Student {
	
	/**
	 *  - @JsonIgnore注解
	 *  	用于排除某个属性，这样该属性就不会被Jackson序列化和反序列化。
	 */
	@JsonIgnore
	private Integer id;
	
	/**
	 *  - @JsonProperty注解:
	 *  	指定一个属性用于JSON映射，默认情况下映射的JSON属性与注解的属性名称相同，不过可以使用该注解的value值修改JSON属性名，
	 *  	该注解还有一个index属性指定生成JSON属性的顺序，如果有必要的话。
	 */
	@JsonProperty(value="StudentName", index = 1)
	private String name;

	@JsonProperty(index = 2)
	private Integer age;
	
	/**
	 * - @JsonFormat注解：
	 * 		用于将日期格式转换成对应的模式
	 */
	@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
	@JsonProperty(index = 3)
	private Date birthday;

	/**
	 * - @JsonInclude注解：
	 * 		用于仅在该字段不为空时显示该字段
	 */
	@JsonProperty(index = 4)
	@JsonInclude(JsonInclude.Include.NON_EMPTY)
	private Integer mobile;

	@JsonProperty(value = "phone", index = 5)
	private Integer studentPhone;
	
}
